//---------------------------------------------------------------------------

#ifndef __UDP_SIMULINK_H
#define __UDP_SIMULINK_H
//---------------------------------------------------------------------------
#include <stdio.h>              // printf
#include <string.h>             // strerror
#include <errno.h>              // errno
#include <unistd.h>             // getopt, sleep
#include <stdlib.h>             // atoi, atexit
#include <signal.h>             // signal
#include <err.h>                // err
#include <errno.h>              // errno
#include <sched.h>              // sched_yield
#include <sys/time.h>           // gettimeofday
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>

#include "String.h"
#include "Socket.h"
#include "Thread.h"
#include "can_usb.h"

#define BUFFER_SIZE 1024
#define UDP_HEADER_SIZE 1

typedef enum {
	SERVO_PKT,
	CONF_PKT,
	AIR_PKT,
	IMU_PKT,
	ENG_PKT,
	GPS_PKT
} PACKET_TYPE;

// ==========================================================================
class UDPSimulink : public pThread
{
	private:
		void initUDP(String port,
				 Socket::SocketType type,
				 Socket::SocketMode mode,
				 String host
				 );
		int  readUDP();
		int  writeUDP(PACKET_TYPE type);
		bool checkSocketConnection();

		void setStatus(const char* status);
		void setError(int errsv);

		Socket *sock;
		Socket::SocketType sockType;
		Socket::SocketMode sockMode;

		char buffer[BUFFER_SIZE];

	public:
		UDPSimulink(String name);
		~UDPSimulink();
		bool init(ShmStruct * shmStructPtr);
		void update ();
};

#endif
